package com.hundun.tt_pay.pay.service.impl;

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alipay.api.AlipayClient;
import com.alipay.api.DefaultAlipayClient;
import com.alipay.api.request.AlipayTradePagePayRequest;
import com.alipay.api.response.AlipayTradePagePayResponse;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.hundun.config.AlipayConfig;
import com.hundun.domain.Result;
import com.hundun.login.entity.XcxInfo;
import com.hundun.login.service.XcxInfoService;
import com.hundun.tt_pay.pay.entity.Info;
import com.hundun.tt_pay.pay.mapper.InfoMapper;
import com.hundun.tt_pay.pay.service.InfoService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.hundun.tt_pay.src.main.java.com.bytedance.caijing.tt_pay.TTPayLog;
import com.hundun.tt_pay.src.main.java.com.bytedance.caijing.tt_pay.TTPayService;
import com.hundun.tt_pay.src.main.java.com.bytedance.caijing.tt_pay.model.TradeCreateRequest;
import com.hundun.tt_pay.src.main.java.com.bytedance.caijing.tt_pay.model.TradeCreateResponse;
import com.hundun.util.OrderIdUtil;
import com.hundun.util.RedisUtils;
import io.swagger.models.auth.In;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

/**
 * <p>
 *  服务实现类
 * </p>
 *
 * @author 谢
 * @since 2020-05-08
 */
@Service
@Slf4j
public class InfoServiceImpl extends ServiceImpl<InfoMapper, Info> implements InfoService {

    @Autowired
    RedisUtils redisUtils;
    @Autowired
    XcxInfoService xcxInfoService;


    @Override
    public Result<JSON> userPay(String openId, String appId, Integer tpye) throws Exception {
        String order=redisUtils.get(openId+appId);
        if(order==null){
           XcxInfo xcxInfo =xcxInfoService.getOne(new QueryWrapper<XcxInfo>().
                   eq("app_id",appId));
           //生成订单号
           String orderId = OrderIdUtil.OrderNum();
           String alipayUrl=aliUrl(xcxInfo,orderId);
           String payInfo=payInfo(xcxInfo,"",alipayUrl,orderId,openId);

           //有效期为8分钟
           redisUtils.set(openId+appId,payInfo,480);
           return Result.OK(JSONObject.parseObject(payInfo));
        }else {
           //如果有未支付的头条订单数据 直接返回缓存
            return Result.OK(JSONObject.parseObject(order));
        }

    }

    @Override
    public String aliUrl(XcxInfo xcxInfo,String orderId) throws Exception {
        AlipayClient alipayClient = new DefaultAlipayClient("https://openapi.alipay.com/gateway.do",
                AlipayConfig.app_id, AlipayConfig.private_key, "json", "GBK", AlipayConfig.public_key, "RSA2");

        //设置请求参数
        AlipayTradePagePayRequest request  = new AlipayTradePagePayRequest();
        request.setReturnUrl(AlipayConfig.return_url);
        request.setNotifyUrl(AlipayConfig.notify_url);
        request.setBizContent("{\"out_trade_no\":\""+ orderId +"\","
                + "\"total_amount\":\""+ xcxInfo.getPrice() +"\","
                + "\"subject\":\""+ xcxInfo.getXcxName() +"\","
                + "\"body\":\""+ "小程序功能体验" +"\","
                + "\"timeout_express\":\"10m\","
                + "\"product_code\":\"FAST_INSTANT_TRADE_PAY\"}");
        AlipayTradePagePayResponse response = alipayClient.sdkExecute(request);
        if(response.isSuccess()){
            System.out.println("调用成功");
        } else {
            System.out.println("调用失败");
        }
        return response.getBody();
    }

    @Override
    public String wxUrl() {
        return null;
    }

    @Override
    public String payInfo(XcxInfo xcxInfo,String wxUrl,
                          String alipayUrl,String orderId,String openId) {
        //log级别可配置为 debug，info，warn，error
        TTPayLog.logLevel = TTPayLog.LogLevel.debug;
        //支付方分配给业务方的ID，用于获取 签名/验签 的密钥信息
        TTPayService.appId = xcxInfo.getPayAppId();
        //支付方密钥
        TTPayService.appSecret = xcxInfo.getPaySecret();
        //支付方分配给业务方的商户编号
        TTPayService.merchantId = xcxInfo.getMerchantId();
        // 测试请用https://tp-pay-test.snssdk.com, 线上请用https://tp-pay.snssdk.com
        TTPayService.tpDomain = "https://tp-pay.snssdk.com";
        TradeCreateRequest request = TradeCreateRequest.builder()

                // 下面两个版本号，AppletVersion指的是小程序收银台版本，Version指的是财经后端下单接口版本
                // 小程序收银台版本有1.0和2.0，头条APP只在7.2.7之后支持收银台2.0版本，7.2.7之前的版本请使用1.0
                // 该参数可设置为"1.0"(返回拉起1.0收银台参数)，"2.0"(返回拉起2.0收银台参数),"2.0+"(返回一个json，包含1.0和2.0参数)
                // 小程序收银台版本，可选1.0，2.0及2.0+
                .appletVersion("2.0+")
                // 后端下单接口默认为2.0， 可更改为1.0
                .version("2.0")
                // 此处是随机生成的，使用时请填写您的商户订单号
                .outOrderNo(orderId)
                // 填写用户在头条的uid
                .uid(openId)
                // 填写订单金额
                .totalAmount(1L)
                // 填写币种，一般均为CNY
                .currency("CNY")
                // 填写您的订单名称
                .subject("测试订单")
                // 填写您的订单内容
                .body("测试订单内容")
                // 交易时间，此处自动生成，您也可以根据需求赋值，但必须为Unix时间戳
                .tradeTime("" + System.currentTimeMillis() / 1000)
                // 填写您的订单有效时间（单位：秒）
                .validTime("3600")
                // 填写您的异步通知地址
                .notifyUrl("http://www.baidu.com")
                // 严格json字符串格式
                .riskInfo("{\"ip\":\"127.0.0.1\", \"device_id\":\"122333\"}")
                // 固定值，不要改动
                .productCode("pay")
                // 固定值，不要改动
                .tradeType("H5")

                // 1.0版本特有参数，当AppletVersion填"1.0"和"2.0+"时需要填写
                // 传递给支付方的支付信息，不同的支付方参数格式不一样
                .params("...")
                // 1.0版本的PayType，目前只支持支付宝，请填写ALIPAY_APP
                .payType("ALIPAY_APP")
                // 目前只支持支付宝，请填写ALIPAY_NO_SIGN
                .payChannel("ALIPAY_NO_SIGN")

                // 2.0版本特有参数，当AppletVersion填"2.0"和"2.0+"时需要填写
                // 2.0版本的PaymentType，固定值direct，不要改动
                .paymentType("direct")
                // 调用微信H5支付统一下单接口返回的mweb_url字段值。service=1时(外部开发者)必传，否则无法使用微信支付; 内部用户该参数不用传
                .wxUrl(wxUrl)
                // service=1时(外部开发者)，且wx_url有值时，传固定值：MWEB; 内部用户该参数不用传
                .wxType("MWEB")
                // 调用支付宝App支付的签名订单信息，详见支付宝App支付请求参数说明。service=1时(外部开发者)必传，否则无法使用支付宝支付; 内部用户该参数不用
                .alipayUrl(alipayUrl)
                .build();
        try {
            TradeCreateResponse response = TTPayService.TradeCreate(request);
            return response.getAppletParams();
        } catch (Exception e) {
            e.printStackTrace();
            log.error("字节报错");
            return null;
        }
    }
}
